{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "459912e3-fc62-4206-91d6-f74068d5ac26",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from imblearn.over_sampling import SMOTE\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.metrics import classification_report, confusion_matrix, accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a350ccc5-df75-4f34-afbe-afdffa09605c",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('/Users/enrikasoucy/Downloads/archive (13)/INCART 2-lead Arrhythmia Database.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3cce35b7-3df4-4f79-9f7a-cd71b64004c6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>record</th>\n",
       "      <th>type</th>\n",
       "      <th>0_pre-RR</th>\n",
       "      <th>0_post-RR</th>\n",
       "      <th>0_pPeak</th>\n",
       "      <th>0_tPeak</th>\n",
       "      <th>0_rPeak</th>\n",
       "      <th>0_sPeak</th>\n",
       "      <th>0_qPeak</th>\n",
       "      <th>0_qrs_interval</th>\n",
       "      <th>...</th>\n",
       "      <th>1_qPeak</th>\n",
       "      <th>1_qrs_interval</th>\n",
       "      <th>1_pq_interval</th>\n",
       "      <th>1_qt_interval</th>\n",
       "      <th>1_st_interval</th>\n",
       "      <th>1_qrs_morph0</th>\n",
       "      <th>1_qrs_morph1</th>\n",
       "      <th>1_qrs_morph2</th>\n",
       "      <th>1_qrs_morph3</th>\n",
       "      <th>1_qrs_morph4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>I01</td>\n",
       "      <td>N</td>\n",
       "      <td>163</td>\n",
       "      <td>165</td>\n",
       "      <td>0.069610</td>\n",
       "      <td>-0.083281</td>\n",
       "      <td>0.614133</td>\n",
       "      <td>-0.392761</td>\n",
       "      <td>0.047159</td>\n",
       "      <td>15</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.023370</td>\n",
       "      <td>14</td>\n",
       "      <td>3</td>\n",
       "      <td>23</td>\n",
       "      <td>6</td>\n",
       "      <td>-0.023370</td>\n",
       "      <td>-0.011650</td>\n",
       "      <td>0.082608</td>\n",
       "      <td>0.101373</td>\n",
       "      <td>-0.183387</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>I01</td>\n",
       "      <td>N</td>\n",
       "      <td>165</td>\n",
       "      <td>166</td>\n",
       "      <td>-0.097030</td>\n",
       "      <td>0.597254</td>\n",
       "      <td>-0.078704</td>\n",
       "      <td>-0.078704</td>\n",
       "      <td>-0.137781</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>0.081637</td>\n",
       "      <td>15</td>\n",
       "      <td>5</td>\n",
       "      <td>27</td>\n",
       "      <td>7</td>\n",
       "      <td>0.081637</td>\n",
       "      <td>0.102992</td>\n",
       "      <td>0.191225</td>\n",
       "      <td>0.217544</td>\n",
       "      <td>-0.068248</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>I01</td>\n",
       "      <td>N</td>\n",
       "      <td>166</td>\n",
       "      <td>102</td>\n",
       "      <td>0.109399</td>\n",
       "      <td>0.680528</td>\n",
       "      <td>-0.010649</td>\n",
       "      <td>-0.010649</td>\n",
       "      <td>-0.720620</td>\n",
       "      <td>6</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.148539</td>\n",
       "      <td>33</td>\n",
       "      <td>13</td>\n",
       "      <td>52</td>\n",
       "      <td>6</td>\n",
       "      <td>-0.148539</td>\n",
       "      <td>-0.060620</td>\n",
       "      <td>0.081080</td>\n",
       "      <td>0.204400</td>\n",
       "      <td>0.335172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>I01</td>\n",
       "      <td>VEB</td>\n",
       "      <td>102</td>\n",
       "      <td>231</td>\n",
       "      <td>0.176376</td>\n",
       "      <td>0.256431</td>\n",
       "      <td>-0.101098</td>\n",
       "      <td>-0.707525</td>\n",
       "      <td>-0.101098</td>\n",
       "      <td>4</td>\n",
       "      <td>...</td>\n",
       "      <td>0.046898</td>\n",
       "      <td>21</td>\n",
       "      <td>9</td>\n",
       "      <td>34</td>\n",
       "      <td>4</td>\n",
       "      <td>0.046898</td>\n",
       "      <td>0.083728</td>\n",
       "      <td>0.279512</td>\n",
       "      <td>0.526785</td>\n",
       "      <td>0.450969</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>I01</td>\n",
       "      <td>N</td>\n",
       "      <td>231</td>\n",
       "      <td>165</td>\n",
       "      <td>0.585577</td>\n",
       "      <td>0.607461</td>\n",
       "      <td>-0.083499</td>\n",
       "      <td>-0.083499</td>\n",
       "      <td>-0.167858</td>\n",
       "      <td>3</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.112552</td>\n",
       "      <td>32</td>\n",
       "      <td>5</td>\n",
       "      <td>43</td>\n",
       "      <td>6</td>\n",
       "      <td>-0.112552</td>\n",
       "      <td>0.012989</td>\n",
       "      <td>0.091491</td>\n",
       "      <td>0.134004</td>\n",
       "      <td>0.265232</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 34 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "  record type  0_pre-RR  0_post-RR   0_pPeak   0_tPeak   0_rPeak   0_sPeak  \\\n",
       "0    I01    N       163        165  0.069610 -0.083281  0.614133 -0.392761   \n",
       "1    I01    N       165        166 -0.097030  0.597254 -0.078704 -0.078704   \n",
       "2    I01    N       166        102  0.109399  0.680528 -0.010649 -0.010649   \n",
       "3    I01  VEB       102        231  0.176376  0.256431 -0.101098 -0.707525   \n",
       "4    I01    N       231        165  0.585577  0.607461 -0.083499 -0.083499   \n",
       "\n",
       "    0_qPeak  0_qrs_interval  ...   1_qPeak  1_qrs_interval  1_pq_interval  \\\n",
       "0  0.047159              15  ... -0.023370              14              3   \n",
       "1 -0.137781               3  ...  0.081637              15              5   \n",
       "2 -0.720620               6  ... -0.148539              33             13   \n",
       "3 -0.101098               4  ...  0.046898              21              9   \n",
       "4 -0.167858               3  ... -0.112552              32              5   \n",
       "\n",
       "   1_qt_interval  1_st_interval  1_qrs_morph0  1_qrs_morph1  1_qrs_morph2  \\\n",
       "0             23              6     -0.023370     -0.011650      0.082608   \n",
       "1             27              7      0.081637      0.102992      0.191225   \n",
       "2             52              6     -0.148539     -0.060620      0.081080   \n",
       "3             34              4      0.046898      0.083728      0.279512   \n",
       "4             43              6     -0.112552      0.012989      0.091491   \n",
       "\n",
       "   1_qrs_morph3  1_qrs_morph4  \n",
       "0      0.101373     -0.183387  \n",
       "1      0.217544     -0.068248  \n",
       "2      0.204400      0.335172  \n",
       "3      0.526785      0.450969  \n",
       "4      0.134004      0.265232  \n",
       "\n",
       "[5 rows x 34 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "3ebf25e9-d3da-485d-9f32-cdf1bf48ad84",
   "metadata": {},
   "outputs": [],
   "source": [
    "type_counts = data['type'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "db60d359-d908-4381-b964-d2026ec29ae7",
   "metadata": {},
   "outputs": [],
   "source": [
    "type_names = {\n",
    "    'N': 'Normal',\n",
    "    'SVEB': 'Supraventricular ectopic beat',\n",
    "    'VEB': 'Ventricular ectopic beat',\n",
    "    'F': 'Fusion beat',\n",
    "    'Q': 'Unknown beat'\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "07d62f4d-d54c-4835-8bbb-f1c65bc6e3f7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counts of Each Type:\n",
      "Normal: 153546\n",
      "Ventricular ectopic beat: 20000\n",
      "Supraventricular ectopic beat: 1958\n",
      "Fusion beat: 219\n",
      "Unknown beat: 6\n"
     ]
    }
   ],
   "source": [
    "print(\"Counts of Each Type:\")\n",
    "for type_code, count in type_counts.items():\n",
    "    print(f\"{type_names[type_code]}: {count}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "33030ec3-5768-424c-80ad-656cc4eae94c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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pRuWv/5WDwCQVXGkDQBwy4oWLapZs2apUaNGKlWqlJo3b67HHntMV69e1aZNmzR37lzrvmrlypVTixYtNHXqVMXGxuqpp57Sli1bNGPGDIWFhWUYZKNNmzZq3769GjRooNq1a+uXX37RypUrlS9fvjvutWLFipo8ebKGDh2qYsWKqUCBAnr66adVunRp/fe//1XFihWVJ08ebdu2TfPmzVPHjh3/cX29e/fW119/reeee07vvPOO8uTJoxkzZujo0aP69ttv5eJy59+D/vrrr/rqq69umO7n56fatWurZMmSKlq0qLp3764///xTXl5e+vbbb296Dd/48eNVo0YNVahQQe3atVNQUJD++OMPLV26VLt27brjHm9XvXr1lDdvXs2dO1fPPfecChQocNO6PHnyqEaNGmrZsqWio6M1duxYFStWTG3btpUkubi4aNq0aXruuedUpkwZtWzZUg899JD+/PNP/fDDD/Ly8tLixYvv2esCAKdw4siVAID71K+//mratm1rihQpYtzd3U3u3LnNf/7zHzNhwgRz5coVqy45OdkMHjzYBAUFGTc3NxMYGGgiIiIy1BhjTGpqqunVq5fJly+fyZEjhwkNDTVHjhz52yH/t27dmmH59OHjf/jhB2taVFSUqVevnsmdO7eRZA1LP3ToUFOlShXj4+NjsmfPbkqWLGnee+89c/Xq1X993b/99ptp2LCh8fHxMZ6enqZKlSpmyZIlN9TpLg35f/1Q+vv37zchISEmV65cJl++fKZt27bml19+MZLM559/nmGde/fuNfXr17f6LFGihOnfv781P33I/7Nnz2ZYLv39PXr06C31bszf31rBGGPefvttI8nMmjXrhnnpv7Ovv/7aREREmAIFCpjs2bObevXq3XC7AmOM2blzp3n55ZdN3rx5jYeHhylcuLB59dVXzZo1a265VwC4XzmMucfnSwAAgAdC165d9emnnyoqKko5cuTIMG/dunWqVauW5s6dq4YNGzqpQwC4P3BNGwAAuOuuXLmir776Sg0aNLghsAEAbg/XtAEAgLvmzJkz+v777zVv3jydP39enTt3dnZLAHDfI7QBAIC7Zv/+/WrSpIkKFCig8ePH/+291QAAt45r2gAAAADAxrimDQAAAABsjNAGAAAAADbm1Gva1q9fr9GjR2v79u06ffq05s+fr7CwsAw1Bw4c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fcnesGFDnTp1Snny5FHdunX18ccfW39rNm3apP379+vKlSv3slVb4PRI2NLWrVv1xhtvqHDhwho3bpyKFy+u1NRUzZw5U5MmTZK/v7++/PJL5c6d29mtAnfV3LlzVb9+fWv0vP79+2v58uX6448/VK9ePb322mt69tln1bdvXy1atEju7u4qVqyYjh8/rsuXL2vr1q1yc3PjdDNkmoMHD6pkyZLW4wkTJmjr1q1ydXVVrVq11KxZM50/f17Vq1eXr6+vGjZsqJw5c2revHk6c+aMdu7cKVdXV07bvcdmzJihWrVqqVChQpKk7777Tr1799bly5fl4+Ojli1b6s0339TPP/+sfv366cyZM3r44Yfl5uamffv2admyZXriiSec/CqQFaR/PqVfBnPw4EGdPn1a/v7+8vf3l6+vr/r376+vv/5aLVu2VN++fXX06FFNmzZNU6ZM0U8//aTSpUs7+2Xcc4Q22Ia5bojXw4cPa9y4cdqzZ48OHTqkgIAASde+2f366681depUubq6avHixRmuiwDuZ2vXrlVISIgGDx6s/v37a9y4cRo2bJgGDhwoNzc3zZgxQ8YYtW/fXs2aNdOyZcu0atUqpaamKigoSO+8845cXV0ZMh2ZZvTo0frwww81b948Va9eXX379tXEiRNVt25dXb58WQsXLlSbNm00fvx4XbhwQW+99Zb+/PNP5c6dW8WKFdPEiRPl5ubGNnqPxcfHq2jRogoKCtLixYt1+vRpPf300+rWrZsqVaqk+fPna+vWrapatao++OAD/f7779qyZYs2b96s8uXLKyQkREWLFnX2y0AWMHLkSHl7e6t58+bKkSOHvv32W7Vq1Up58+ZVdHS0nn76aYWHh6tKlSpWcEtJSdFDDz2ky5cva/bs2Q/ulwf3fOgT4B8sWbLEFClSxCxbtsysWrXKlCxZ0lSqVMkaDtqYayOMTZ061dSuXducOHHCid0Cd99nn31mXF1dzciRI82QIUPM119/bc07duyYad26tQkODv7b0bLSR+IDMsPq1avNK6+8Yp544gmzaNEi0759e7Nx40Zr/sqVK42np6fp2rWrMcaY1NRUc/HiRXP58mWrhlEineOPP/4wpUuXNjVr1jTffPON6d69e4b548aNM+XKlTMTJ050Uod4ELRu3dq4uLiY6dOnm/3795vSpUubiRMnmtOnT5uFCxeaV155xVSoUMGsX7/eGGPM0aNHzWeffWY2bNhg/vzzTyd371yENjhd+rD+UVFRpmnTpmbcuHHGmGsf9t9//70pV66cqVatmrly5Yq1THJyMsMNI8uaNm2ayZYtm3E4HNYOVPq/k1OnTpmHHnrIjBgxwpkt4gH2008/mVdffdWUKVPGFClSxBw4cMAY839fGMybN894eHhYO13X4z5sznXs2DFTokQJ43A4zAsvvGDdEiRdixYtTIUKFZzUHR4U4eHhJkeOHOb99983zZo1M4mJida8LVu2mPr165uGDRuaS5cuObFL++Fkcjidw+HQxo0b1bJlSx0+fFhVqlSRdO2i9qeeekrvv/++rly5otq1a1ujVrm6usrLy8uZbQOZpnXr1po5c6ayZcumLVu26NKlS9a8ggULqnr16jp48KATO8SDyPz/qylq1Kiht99+W2XKlNGxY8f0xx9/ZKirVq2aAgICFB0dfcM6GCjKuQoVKqRVq1apatWq+uWXX7R///4M85999lldvnxZMTExTuoQWVlqaqokacyYMWrTpo169Oih77//XufOnbNqKleurEaNGmnp0qU3/RvyICO0wRb8/f119OhRbdmyRTt37rSmp1/YPmbMGB0/flwvvviiE7sE7p1GjRpp2rRp+vLLLzVixAhrJ+ry5cs6dOgQ9yTEPedwOKzg9tRTT6lLly4KDQ1Vhw4d9OOPP1oD3+TKlUvGGIaGt6lChQppzpw5ypEjh1q3bq3du3dbv6t169Ype/bscnd3d3KXyIqyZctmBbdx48apf//+ioqK0ty5cxUfH2/VVahQQQULFtSFCxec1aotMRAJbOPYsWOqX7++cuTIoXfffVdPP/20NS81NVUbNmxQYGCgHnnkESd2Cdxbn3/+udq2bauqVauqRIkSOn/+vI4ePaodO3YwkAOcwvz/QaMkaePGjRozZox++uknRUREyNPTUytWrNCRI0e0Z88eRjC1sePHjys0NFRxcXEqVaqUHn30UX333XdauXKlypcv7+z2kIVdP7pxeHi4Jk6cqKFDh6p+/frKmzevhg8fri+//FK7du2Sn5+fk7u1D0Ib7rn0D/xDhw7pxIkT8vHxkb+/vx5++GEdPnxYDRo0UMGCBRUREaH//ve/zm4XyBTXD3f+b0Ofz5o1S23atFGRIkU0duxYPf3004wSiUz31+3y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5OnpqWnTpnHjbGS667evESNG6KefftK+fftUv3591atXTyEhITpx4oRef/117dixQ4ULF1b16tW1fft2bdmyhRtnO1H6+/7tt9/qzTff1CuvvKJ33nnHOuXx22+/tYJb//79raHVgbstfVtct26dli5dqgsXLqhy5cpq2bKl3N3drVs7LV26VAkJCUpNTdV3332nSpUqObv1LInQBgB3aPTo0RoxYoRmz54tV1dXHTp0SIMHD1blypW1aNEiSdcu0h42bJh69uypJk2aKCAggJsS457p16+fpkyZoh49eiglJUVz585V3rx51bp1a73++us6evSounfvrqVLl2rjxo2qWLGiJLGNOln6ADDjx4/XG2+8ccP85cuXa9y4cUpMTNT48eNVvnz5e94jHgzz589XkyZNVLt2bRljtGLFCoWFhalPnz7WdrdmzRrNmTNHS5Ys0ebNmxUYGOjcprOqeztYJQDcv64fMj0xMdG8/PLLZsSIEda0q1evWkOpDxo0yJo+aNAgExgYaIYNG8Z9anDPHDp0yJQuXdosW7bMmrZ3717z+uuvm2eeecYcOHDAqqtRo4YJCgoyp0+fNsYYk5qa6pSecc348eNNgwYNjDHX7m+6ePFi88orr5g6deqYOXPmGGOMmT17tqlfvz5/U5BpTp48aR599FHz0UcfWdO2bdtmChcubBo3bmzdm80YY+Lj482FCxec0OWDg3NzAOAWXX+qmKurq44cOaLDhw9b09zc3FSrVi298MIL2rNnj5KTkyVJAwcOVPv27TV06FDNnTuXkfhw1xljbtiusmfPrtjYWGs7NMaoTJky6t+/v3bt2mWN5vvoo49q+vTpKly4sEqWLKmoqChO3b3HzF9Oerpy5Yq+++47LVmyRI0bN9akSZPk4uIiNzc39e7dW+fPn1ejRo00Y8YMjmog06SlpSklJUWPPfaYpGtH4CtWrKh58+Zp3rx5Wrx4sVWbO3du+fj4OKnTBwN/lQHgX2zfvt0KZx06dNCcOXPk5uaml19+Wb/99psiIyOtWldXVz388MM6c+aM0tLSrBEm+/Tpo8GDB+uFF15gJD7cdWfOnLG2q+nTp2vv3r1ycXGxTtuVru2AGWNUsmRJPf7449q/f7+1fNGiRfXxxx+revXqN4xuiszncDgUGRmpvn37SpJ69OihRo0aqX379ipYsKB69+6t2bNn6+OPP5anp6dOnz4t6dqOMpBZjDE6c+aMTpw4YU1LTU1VpUqVFBwcrN27dzuxuwcPJ6wDwN8wxuj48eMKDQ1VkyZNlJCQoC+//FLt2rWTJD333HOaP3++dbPi//73v4qNjdWPP/6o4sWLy8PDQ9L/DQrRvXt3Z74cZFGbN2+2dqBmzJihmTNnatOmTXrooYfUrVs3hYeHq0iRInrllVckSYmJibpw4cINt2B59NFHtXDhQkZ8c4Lk5GQtWrRI3377rdzd3TVw4EB9/fXXOn78uAoVKmTVTZgwQZ6enipYsKATu0VWZP7/oCNJSUnWZ1ehQoXUtm1bRURE6KGHHlKtWrWseofDIS8vL2e1+0BiIBIA+BfLli1T06ZNlZCQoLlz5+rFF1/MMCR3nz59FBcXJ0nKmTOnrl69qu3btzMCH+6JmJgY9erVS19//bVcXV31yy+/qHDhwtZR3n79+mnEiBFq0aKFcufOrf379ysqKkq7du1isBEbiYqK0qRJk7R48WLVq1dPQ4cOteatXLlSixcv1qxZs7R27VoGHsFdlf45tXLlSn355ZeSpMaNG+uZZ57RuXPn1Lt3b61du1aDBw9WgQIFFBkZqalTp2rz5s169NFHndz9g4O/1gBwE9cPmZ43b15lz55dbm5u+uGHH1S8eHFr+O2nn35aX3zxhY4ePaqffvpJRYoU0RtvvCFXV1dG4EOmSt/RypMnj0qVKqXExER5eHjo3LlzKly4sBwOhxwOh4YNG6bHH39c8+bN05kzZ1SsWDEtX75crq6uSk1N5XTde+Rmt/k4ceKEdU2av7+/OnTooJSUFOv3M2jQIMXGxmrbtm06cOCA1q9fb11fBNwt6cP6P//882rdurU2bdqkAwcOaMuWLerTp49Gjx6t8ePHKyIiQgULFlT27Nn1ww8/ENjuMY60AcBfXL9zFRkZqeDgYEnSokWL9Pbbb+ull15Sp06dVLJkyb9dBzvDyEzXb6NRUVFKTU1VTEyMJkyYoK+++korV67Uk08++Y83uOVLhXsn/fe1Y8cOLV26VP3799e+ffvUqlUrvf766+rcubNVe/r0aQ0fPlzz589X165dFR4erqSkJCUmJsrX19eJrwJZ1YkTJzRlyhQVLFhQHTt2lHTtOuzvv/9etWvXVkREhHLlyqXTp0/L09NTLi4u8vb2dnLXDx4GIgGA6xhjrJ3hvn376rXXXtP48eNljNGLL76oDz/8UAsXLtSkSZO0b98+SVLt2rW1cOHCDOshsCGzXB/YhgwZou7du2v//v0qW7ashg4dqldffVWhoaHatGmTFdhGjBiRYeARYwyB7R5J/33t3r1blStXtk6l9vDwUNGiRTVv3jxNnjzZqi9YsKC6du2qlJQUDR06VO+99548PDwIbMgUe/bsUZMmTTRv3rwM10q+++67ql27tlavXq1hw4YpJiZGBQsWlK+vL4HNSfiLDQDXSb/+bOjQofr444+1ePFiBQUFWdNfeeUVORwO9ezZU3v27NHFixd1/vx51a1b15lt4wGSHtj69OmjqVOn6tNPP1WZMmUkSQUKFNCYMWPkcDj03//+V++9956WLl2qCxcuqEePHtY6uM7y3kgPbL/88ouCg4PVu3dvvffee5KkYsWKafTo0RowYIC++OILSdJbb70lSXJ3d1eNGjX02GOPqWnTpk7rH1lT+qnVaWlpKlasmIoUKaJdu3Zp3bp1CgsLU7Zs2eTq6qohQ4YoW7ZsmjNnjjw8PDRgwAD+djgRp0cCwF/ExMSoQYMGat68uVq2bGlNv/50spUrV2rz5s1KTEzU0KFDuYYN99TmzZvVvHlzTZ06VU899dQN8xMSEjR06FB9//33KlKkiGbNmiU3N7ebXleFzHXkyBGVLVtW3bt315AhQ6wd5hkzZqhChQry8vLSu+++q3379un5559Xy5YtNXHiRO3du1fTp09Xnjx5nP0SkIWkb3+LFi3Shg0bNGrUKF2+fFmdO3fWtm3b9MYbb6h9+/Zyd3eXdO2Lh2HDhqlp06YqUqSIc5t/wLF3AQB/cenSJW3bts0a2j+dq6urNdhDaGioQkJCrNMgCWy4ly5duqTExMQbhu2Xrg0fnzNnTg0fPlzh4eHKly+fHA4H26gTpKWl6bPPPlPu3LmVN29eSdeOcg4dOlTjxo3TkiVLVLZsWfXt21effPKJJkyYoE8++UQpKSlasmQJgQ13xaJFixQQEKBKlSpZR8qWL19uDYKTPXt2jR07Vh06dNCsWbNkjNFbb70ld3d3ubi4qF+/fs5sH/8ff70BPNBuNiR/zpw59fjjj+vAgQNKSEhQzpw5rboffvhB69at08iRIzNct8bOMDJL+rZnjLGuuYyJiVFiYqJy5MghSbp69ar1zfjatWuVlJSkF198Ufnz57fWwTZ677m4uKhjx45KTEzU7Nmz5enpqfj4eI0fP15ffPGFqlatKmOMHnnkEfXr10+tW7fW0aNHVaZMmZsGcuB2pN9rtGnTpnr++efVq1cvlStXTpJ06tQpFShQQNK1gbNy5MihiRMnqmPHjpo3b54uX76s8PBw6+8KnI9zJAA8sNLS0qzAFhMToxMnTki6NsT/f//7X3300UdaunSpLl++LIfDocTERE2dOlVHjhzhvH7cE9dvo9d75ZVX5O/vr0aNGkmStWOVmJiocePGaffu3Rnq2V6dJyAgQL1791blypU1duxY9e3bV7Nnz9Zzzz2n1NRU63eTM2dOFStWTLVr1yaw4a5wOBwqXLiw5s+fry1btuj999/Xzp07JSnDCJAuLi5WcJswYYIKFiyo1atXKyEhwZnt4y+4pg3AA+n6I2zvvvuuVqxYod9++00VKlTQG2+8oUaNGqlVq1Zas2aNypYtq/z58+vQoUO6ePGiduzYwY2zkemuv/5s8uTJ2rhxoy5fvqyyZctq0KBBWrNmjd58803lzJlT/fr106VLlzRnzhz9+eef2rlzJ0fWbCY6OlrDhg3TunXr1Lx5c3Xr1k0StwdB5rr+LJFWrVqpatWqioiI0PDhw9WoUSPVr1//hmWSk5N1/vx5+fv7O6Fj/B1CG4AH2rvvvquJEyfqo48+UvXq1a1vv1esWKHAwEBNnTpVe/fu1alTp1SqVCkNHDiQQUdwT/Xq1UtffvmlWrVqpYIFC6pTp056++23NXLkSB0/flzdu3fXkSNHlCNHDhUrVswadIQwYD9RUVF67733tHXrVtWvX1+9evWSdPMbbwN3w/Xb1tq1a9W6dWvVrFlTa9asUUxMjJ588kldvHhRV69eVfbs2eXn56eZM2fKw8PDyZ3jrwhtAB5IxhhFRUUpLCxMERERCgsL0/r161W3bl2NHTtWbdq0uaE+/agaO8O4V7Zs2aImTZro008/Vc2aNbVy5UqFhYVp7NixevPNN626U6dOKWfOnPLy8mLQEZtLD247d+7UM888o8GDBzu7JWRB6Z9Z6de+pn9urV69Wu3atZOnp6eefPJJ1a1bVxcuXNCFCxfk6+urKlWqWLcQgb3wFx3AA8nhcMjhcCgpKUn16tXTkiVL9Nprr+n9999XmzZtlJiYqHnz5unpp5/Www8/nOE0SAIb7pUzZ87I29tbNWvW1Pz589W8eXMrsMXFxWnDhg2qV69ehmug0tLSCGw25u/vr759+yoiIkKbNm3S+fPnrZElgbvF4XBo2bJlmjRpktzc3BQSEqKmTZuqdu3a+uyzz9SqVStduXJFpUuX1qOPPursdnELOBYP4IHl5eWlxMREvfHGG2ratKnef/99tW/fXpJ0/PhxTZ8+Xfv3/7/27jy6xmv/4/j75OREZKIXEVNrnmL+aZWrRWNsqTGI8SZFlRhSjYihQoOQlpSIKZWbGkJRFdTQip8aooZGKih+lNbUmFKCyHR+f3Tl3KTa24HkBJ/XWlkrec55ztrPWnvlPJ9n7/3dx63cSnmalStXDgcHB8LCwhg4cCDvv/++ZYTtyJEjlsI4uWmaXeHn5uZGSEgIy5cvV2CTfLFv3z66du1K9erVuX37NsuXL8fX15cbN27QqlUrFi9ezP79+xkzZswDhYukcNJ/dhF5KmVnZ+Pg4EBAQADbt2+nTZs2vPnmm5jNZu7du8c777yDra0tHh4e1m6qPMWeeeYZjEYjAQEB+Pn5WQJbWloaoaGhODo6UqVKFSu3Uv6O0qVLU7p0aWs3Q54AOSudsrOzATh9+jTx8fHMmDGD2bNns337dvr168fZs2ctwa1NmzaEhYXx448/UrJkSWs2X/4krWkTkSda7vVnv7XY/8KFC3z44YcsWbKE9u3b4+TkxJkzZ7h27ZqlSqSKBEh++nX/+vWayY0bNzJ8+HCaNWtGq1atKFasGJGRkSQnJ/PNN99ga2urPiryFPr1ujWAkydPMmTIEM6ePUtQUBBvvPEG8EtFyCVLlrB8+XKqVq3KnDlzKFGiRJ5zpXDTf3gReaLl3PyGh4cTFxfHr59TlS9fnjFjxhAVFUVKSgpZWVm0aNGChIQETCYTmZmZuhmWfJXTvzZu3Aj8p8/m9NVOnToxZ84cDAYD48ePZ/HixZQqVYrDhw9ja2tLVlaW+qjIU8hgMPDTTz9Rt25dYmNjAShTpoxl0/bNmzdbRt9MJhNvvvkmAwYM4NChQ4wbN47s7Gzs7e2teQnyF2ikTUSeSL/e42rs2LHs27cPd3f3P32DqyqRkp9y99EpU6YwZcoUvvvuuzxFAXJXLc3IyCAlJQVnZ2fLjZaqRIo83c6dO0dgYCA7duxg6dKldOzYkdTUVN5//302bNhAmzZtCA4Oxs7ODvjlf0Z0dDQeHh5UrFjRuo2Xv0ShTUSeaHv27OHrr7/G1dWV/v37/+6G2GazGbPZjI2NjTbNlgKVkJDA6tWradeuHa1atfrT56mfigjA2bNnCQkJYc2aNSxbtoyOHTty+/ZtZs6cyZdffslLL73EtGnTLMFNHk+aTyEiT6zvvvuOl19+GX9/f1JSUgB+9ybXYDBYRj10IywFZdOmTbz66qusWrWKMmXKADwwhff3qJ+KPF1ypjrmyMzMBKBy5coEBATg6elJv3792LRpE87OzgQEBNC6dWvi4+MZPXo06enp1mi2PCIKbSLyxKpZsyaxsbG4uLiwd+9ebt26Ze0mieRRvHhxPDw8uHTpEklJScAvYUyTYETk12xsbPjxxx9Zt24dgGVNK0CVKlUICAigZ8+eDBo0iB07duDs7ExgYCBNmjTh9OnTloeX8njSRHgReSL8XvW8jh07EhUVRe/evSlXrhwhISGYTCYrtFCedr/VR5s3b469vT1paWmMHTsWR0dHOnToYAluGk0TkRyZmZkEBATw3XffkZGRQe/evTEajZb111WqVMHPz49bt24xbdo06tWrR6lSpXjvvfe4c+cOpUqVsvYlyEPQmjYReezlvhleu3YtP/30E7dv32bUqFEULVrUcrxPnz6MHDmSGTNmKLhJgcrdRw8fPkx6ejr29vY0bNgQgP379zN//nyOHDlCaGgo7du3t2ZzRaSQ+r//+z/eeecdbt26xaBBg+jTpw+Qt3DW2rVr8fX1Ze/evdrH8QmikTYReezl3AyPGzeOZcuWUatWLc6fP8+aNWuYO3cuTZo0oUePHhgMBvr3709KSgoLFy5U1T0pEDkFbgAmTJjAZ599xrVr16hatSpNmjRh9uzZvPjii2RnZ7Nw4UICAgJIS0ujS5cu1m24iBQ6OXusjRgxgsjISAwGA15eXhiNRjIyMjCZTFSvXh1XV1dNs37CaE2biDwR5s6dy/Lly9m0aRNffvklc+bMISEhgaFDh7Jv3z4yMzPp3r07ixYt4vTp0yrlLwUmZ4rjtGnTiIyMZMGCBSQlJdG4cWPCwsIYNGgQAM2aNeOtt96iQoUKljUrIiK/VqlSJebNm4eDgwNLliwhOjoawDKDZMWKFTg4OFCyZElrNlMeMU2PFJHHztSpU2natClt2rQB4MaNG8ycORN3d3cGDBjA+vXr8fb2ZubMmURFRXHnzh3Cw8Np1qxZnmmRv7cOTuRhxcXF8eKLL+Lg4ADA0aNHGTFiBBMmTKBNmzZs27aNHj160KNHDzZu3EiPHj1YuHAhAElJSdSuXVt9U0T+q++//54xY8Zw8eJFXnzxRZo1a8bu3btZs2YNX3zxBfXq1bN2E+URUmgTkcfKkSNHePPNN3nmmWcYP348L7/8MvDLTbK7uztXr16lW7du+Pr6MnLkSDZu3Ejnzp1xdXVl69atNGjQwLoXIE+8f//73/j4+LB06VJ69epF0aJFyc7OZv78+fTt25ekpCS8vLyYPHkyPj4+9O/fn9WrV9O1a9c8I2x6qCAif+TChQt89NFHfPrppxiNRipUqMD06dNxd3e3dtPkEVNoE5HHzrZt25g3bx4ZGRkEBgbSsmVLy2vLli1j8eLFrF69mrJly7Jhwwb27NlDamoq4eHhmhYpBWLMmDFEREQQERGBp6cnTk5OlmqQfn5+3L17l7lz51KkSBEmTZrE4cOHcXFxYeXKlQpqIvKXZWdnc+/ePYxGI/b29tZujuQDrcIXkcdGZmYmtra2tGvXjuzsbObNm8eMGTMwGAy0aNEC+GW6yLlz57h37x7Xrl0jMjKSJk2aEBoaCuStsCXyqOX00Q8++IDs7GyGDh0KQK9evXBwcMBsNpOUlISdnR1FihQhPT2dEydO0K1bN8vaNo2wichfkVPsyNHR0dpNkXykkTYReWxt3ryZiIgIMjIyGD9+PC1btiQ1NZUGDRpw/fp1ihcvjouLC4cOHVKJf8l3vxW2Ro8ezYIFC1i4cCE9e/bE0dGR6OhoJk2aRI0aNbh9+zZ37twhISEBW1tb7c0mIiK/SSNtIvJYWbhwITt27GDNmjW89tprAERERDB9+nSysrLw8PDg2LFjREdH4+TkRM+ePbG1tbWMgIjkl5zAtmbNGooUKcLrr79OWFgYAEOHDsVsNjNw4EA6deoE/DLNt1atWsyePRtbW1uNAouIyO/SSJuIPDbS09NZsGABYWFheHh4EBkZCfxnxC0zM5OxY8fi4eGR5zzdDEtBSU5OplmzZlSvXp1Ro0bRrl074JcRt4iICBYuXMjAgQMf6I96qCAiIv+NJs2LSKGVnZ2d5287Ozu8vb2ZMGECu3btwsfHB4DXXnuNYcOGYWdnx9ixY0lISMhzngKb5JdfP/d0dXVl7dq13Lx5k/DwcLZu3QpAWFgYvr6++Pr6EhERwd27d/N8hgKbiIj8NxppE5FCb/fu3bz00kuWv2/dusWqVasIDQ2lRYsWlhG3devWsX//fmbOnKlCDlKgkpOTcXV1tfydmJjI4MGDKV26NCNGjKBt27YA+Pj4cPbsWXbu3Km1ayIi8qcptIlIobZnzx66devGkCFDCA4OthxPSUlh0aJFBAcHM3jwYGbPnp3nPFXgk4Iyf/58tm/fTlBQEA0bNrQcT0hIoEePHjz33HOMGzfOEtxy+qaKjoiIyJ+lOxoRKVRyT4k0m83UqFGDt956iw0bNjB58mTLa8WLF6dz5844OTkRFhbGe++9l+dzFNgkv/x62m7lypU5fPgwH374IUeOHLEcb9iwIdOmTePgwYNMnz6d+Ph4AAwGA9nZ2QpsIiLyp2kSvYgUGrlHx5YsWQKAp6cnvr6+GI1GYmJiMJvNTJ06FQB7e3vatGmDp6cnr776qtXaLU+P3H00NjYWd3d3OnTowPLly/H29iYrK4u3337bMuJmNptp3bo1rq6uNGnSBPgltCmwiYjIX6FH0SJSaOTcDPv7+zNx4kSMRiN37tyhVKlSDBkyBC8vL2JiYhg4cCDbtm1jyJAhpKWl0bFjR4xGI1lZWVa+AnmS5WxgCzBu3Dh8fX3ZsGEDqamptGzZko8++og9e/Ywe/ZsNmzYwI0bN1i9ejVt27Zl0aJF2NjYPDBKJyIi8mdoTZuIFCoxMTG88847xMbG8j//8z95Xvvpp5/YsmULQUFBODo64urqyvbt2zGZTFofJPnm133rgw8+YMaMGWzZsoUaNWrg4uJiec+uXbuYMGECZ86cwc7Ojn/84x8cOHBAfVRERB6KQpuIWM3WrVtp2bIl9vb2lmMTJ04kMTGR9evXYzQaLet/cq9Ru3PnDleuXKFy5coYDAbtcSUFJiMjg969e9O4cWMCAwMtQSz3XoDnzp3j/PnzXL9+nc6dO2M0GtVHRUTkoegbRESs4t133+Xo0aOWzYfhlxGNU6dOkZWVZbnBzQlsmZmZ7N69m2rVqlG+fHmqVKlieV03w5IfXn/9dZ599lnCw8Mtx+7evUt8fLxlFNhgMGA2mzEajaSlpXHjxg0qVqxIxYoVLefk7s8iIiJ/h9a0iYhVTJ06lTVr1mAwGDh69CipqakYDAa6du3Kjh07WL9+PfCfdW5Xr15l0aJFnDhxIs/nqEqk5JegoKAHtpJwcXGhdevWHDhwgPPnzwNYpjwmJiYyefJkrl69muccbe4uIiIPS3c7IlLg0tPTAbC1tWXLli20atWKtWvXcvfuXTp06ICXlxdjxoxhxYoVpKSkcOrUKQYPHsyZM2d45ZVXrNx6eVo0atQIOzs7wsPDadq0KfBLQGvevDnffvstUVFRnDt3DoCbN28yffp0zp8/T4kSJazYahEReRJpTZuIFKjcxRhWr15Nr1696N27N8ePH8ff35++ffty9uxZFixYQHh4OKVKlcLR0ZESJUqwa9cuTCZTnvVDIo9a7jWUiYmJXLt2jb59+9K4cWM2bdoEwIwZM4iJiSEjI4PSpUtz69YtMjMzOXz4MCaTSZu7i4jII6XQJiIFJndge//99wkMDOTkyZNUrlyZ3r17k5iYyIQJE+jVqxcmk4mjR4/y/fff4+LiwksvvaSCDpLvcvfRgIAAkpKSiIiI4Mcff6Rnz57Uq1ePrVu3ArBjxw5Onz7NiRMnqFatGkOHDsXW1lZ9VEREHjmFNhEpcPHx8axYsYJOnTrlKUSSE9zGjx9Ply5dcHZ2znOeRtikoBw7dozBgwcTGhrKP//5TwB2795Nr1698gS3X1MfFRGR/KC5GyKS73JvKBwbG8vgwYPZvHkz5cuXB+D+/fsArFq1igYNGhAaGsqKFSssx3PoZlgKwvTp0xk/fjxly5alUaNGluPNmzdn9erVHD16lE6dOv3mueqjIiKSHxTaRCRf5V7bc/HiRRo2bEjdunW5cuUKn3/+OQBFihSxFCeJiYnBzc2NPXv2YGdnZ7V2y9OrcuXKbNy4kb179/LDDz9YjhsMBl566SVWr17N5s2b8ff3t2IrRUTkaaJJ9yKSb9asWcPt27fx8fHh7bff5tChQ3z11VdMmTIFo9FITEwMJUuWxNvbGzs7O9LT07Gzs2P79u1kZ2db9sDKWWMk8qjFxcVRqVIlKlWqxMSJEylfvjxDhw7FwcGBLl26EB4ezuTJkylZsqTlnObNm5OQkECdOnWs2HIREXmaKLSJSL759ttvmTZtGmvXrmXPnj3s3r0bgOrVqzNhwgSmT59OZGQkBoOBf/3rX9jZ2ZGRkYHJZMLGxkYV+CRfXbx4kalTp5Kenk7t2rWJjo7m0KFDwC8ba69cuZI+ffrg4ODA2LFj85Tyr1+/PqA1bCIiUjBUiERE8lWdOnU4efIk7777LpMmTcoTxI4fP05ISAjnzp2jd+/eDBs2zMqtladNXFwc/fv35/r166xbt47XXnuN+/fvY2dnh8FgICYmhr59+xIQEMDbb79NqVKlrN1kERF5CukRtojki5ziI3Xr1qV///5MmTKFpUuXWgJbdnY2tWvXZty4cbi4uJCYmIieIUlByemfxYsXx9XVlfr16xMaGsrp06cpUqQImZmZZGdn4+XlxcqVK5k5cyaffPKJlVstIiJPK420icgjk3sULS0tDXt7e8trEydOJCQkhMWLF+Pj42M5funSJRwcHHBxccHGxkZr2CRf/XrK7f3790lPT2fv3r188MEHpKWlERUVRdWqVfOc99VXX9GsWTPtvyYiIlahbx8ReSTMZrPlZjgiIoKEhASKFy+Ot7c3tWrVIjg4GIPBwNChQ0lPT6dDhw6MGjUKgM8++wx48IZa5FHK3b82bNjA/fv3cXJy4tVXX6V9+/akp6czb948Bg0aRGRkJFWrVqVv3760a9eOAQMGAGjjbBERsQqNtInIQ8s9OhYcHExISAienp5s2LABd3d3RowYgaenJwaDgffee4/JkydTu3ZtDAYD33zzDSaTycpXIE+63H3U39+fxYsXU6ZMGc6ePcvIkSN5//33Adi4cSPh4eEcOXKEatWq8cMPP3DmzBn1URERsSo9LhSRh5ZzM3zixAmOHz/Otm3b+Oc//8nt27fx9PRk3rx5ZGdn07NnTyZNmoSHhwepqal4eHhgNBo1eiH5LqePXrx4kV27dvHVV19RvHhx9u/fj7e3N3fu3GHBggV06tSJcuXKsXPnTq5fv87UqVOxtbVVlUgREbEq3SWJyCOxZMkSIiIiMJlMVKhQAQBnZ2c+/vhjBgwYQEREBAA9e/akWbNmlvOysrIU2KRATJ8+ncTEROrXr0/t2rUxmUw899xz2Nvb4+XlhY2NDfPnz6dRo0Y0atTIcp4Cm4iIWJsWj4jII9GiRQsMBgPHjx/nwIEDluOurq4sX74cZ2dnpkyZQlxcXJ7zdDMsBSErK4siRYqwYcMGEhMT80x37Ny5MzExMXz88cf069fvgXPVR0VExNoU2kTkL8spl54jKyuL6tWrs27dOqpVq8aCBQv43//9X8vrJUuWZOnSpbz66qu0atWqgFsrT6Nf91Gj0cjw4cOZO3cu33zzDcHBwXle79y5M5GRkVy+fPmBc0VERKxNhUhE5C/JXYFv9erVnD59mnv37tGlSxeef/55zp49S9euXXFzcyMwMJCWLVs+8Bmabib5KXcfTUhI4MqVK1SqVIkyZcpQrFgx5s6di5+fH8HBwQQGBv7hZ4iIiFibFpKIyF+ScyPr7+/PmjVraNiwIY6OjjRp0oTly5fTp08f1q9fT/fu3Zk1axb379+nXbt2eT5DgU3yS+6tJ8aNG8dnn33GvXv3qFChAk5OTixatIiRI0diNBoZPXo0NjY2BAQEPPA5CmwiIlKY6FtJRP6UY8eOWX5ft24dK1euZM2aNaxfvx4vL688761cuTJr1qwhISGBbdu2FXRT5SmWUyVy3rx5REVFERkZyfnz52nSpAm7du3i1KlTAAwZMoSwsDACAwNZtmyZNZssIiLyhzTSJiJ/6PTp09StW5fY2Fg6duzIhQsXaNu2Lc8//zxr167F29ubhQsX0qdPH37++Wdu3rxJ1apVOXjwIGXKlLF28+UpYjabycjIID4+Hn9/f5o3b86mTZtYvHgxc+fOpU2bNty7d4+srCyGDx+Om5sbnTt3tnazRURE/iuNtInIH3Jzc6Nt27bExsZiNpu5d+8eN27cYO3atfj4+DBr1iyGDBkCwIYNGwgJCSElJYXy5ctjNBrJysqy8hXIkyx34RCDwYCdnR3379+nevXqbNmyBS8vL0JDQxk8eDCZmZmsXLmS7du3A9C9e3dsbW3JzMy0VvNFRET+kEKbiPwhZ2dnWrRowaeffsrVq1dp3bo1P/zwA/3792fKlCm89dZbAKSmpvLJJ59gZ2dHsWLFLOdrDZvkp5z1ZytXrrRM4y1atCijR4/Gy8uL2bNnM3ToUACuXbtGTEwMFy9ezPMZ2itQREQKM4U2EXlATlFZs9ls+T0gIIDSpUsTHBxM48aN8fDwoGTJkty7d49jx44RHx+Pp6cnFy9eZPbs2RgMBlScVgqC2Wzm9u3bDB48mJiYGADmz59PiRIlcHV1pWfPnvz8888kJyfj4+PD3bt3GTZsmJVbLSIi8uep5L+IPCAlJYXixYtb/s7MzMRgMDBp0iS++OILdu3ahYODA0OHDiUhIYGDBw/SpEkTnJ2d2bx5MyaTSWX9pcDklOdfuHAhERERREdH07BhQ+Lj4/Hy8sJoNGIymfjHP/5Beno68fHx6qMiIvJYUWgTkTy2bt3KxIkT8fb2xtPTE1dXV8trZ86coV69ekyaNIlx48YBkJyczJkzZyhXrhzly5fHxsaGzMxMTTeTfGM2my1VInM7cuQIPj4+DBs2jEGDBgFw//59oqOjycjIwM3NjS5dumA0GtVHRUTksaLQJiJ5HDt2jDlz5rBixQrq1q3L888/z6RJk3BycsLJyYmAgAD27NnD8uXLqVSp0gPna1NiKSgbN27E2dk5zwbuAQEBLFu2jOPHj+cZLc5NI2wiIvK40Z2ViOTh7u5OZGQkiYmJtG7dmh07dvD8888zatQoEhIS8PDw4OzZs5ZCDrkr94E2JZaCkZSUxMyZM+nYsSN+fn6WapDjxo2jSpUqREdHYzabH+ifoMI4IiLy+NFIm4j8rqysLDIzMwkNDWXXrl3ExcUxYsQI5s6dS/Pmzdm2bRtFixa1djPlKfBbI7gXL14kMTGRd999FxsbG0qXLs20adMICgoC4NNPP7VCS0VERB49hTYR+V251w7dv3+f2NhYVq5cyZYtW3jhhRfYtWvXb64tEnmUcge2CxcucOfOHWrUqGF5/fLlyxw7dozJkydbRta+/vpr1q5dS7du3azSZhERkUdJoU1E/qtfF334+eefuXz5MtWqVcNoNGoNm+Sr3P0rKCiIdevWkZycTMWKFQkKCuKll17CycnJ8v4VK1Zw+PBhdu/eTXx8vIqNiIjIE0GhTUT+NhV0kIISFBTE4sWLCQsLo3Xr1rRu3Rqz2Yyfnx+enp4PTNPNedigKpEiIvIk0ONxEfnbFNgkv+R+nnjgwAE2bdpEdHQ0PXv2JDExkdOnT5OVlcWECRNYt24dd+/ezXNezubuCmwiIvIkUGgTEZFCJTs72zIl99atW7i5uTF8+HBat27Nzp076dWrFx9++CHffvstxYoVY/bs2URHR5OWlpZnKq/WW4qIyJNCoU1ERAoNs9lsWcM2ZMgQ+vXrR4kSJejUqRNms5n58+czYMAABg4cCEDlypX54Ycf+PrrrylSpIg1my4iIpJvNG9EREQKjZzRsUuXLnHixAmCg4NxdHTE0dGR9PR0rl69Sr169SxTc5955hm++OIL6tevb5kSqRE2ERF50ii0iYhIoTJnzhw2b95MuXLleOGFFyzHTSYTxYoV45NPPuHnn3/m4MGD3Lhxg3r16mFjY6NKpiIi8sTSt5uIiBQaaWlppKenk5SUxMmTJy1VIdPT0zEYDHz66afUrFmTkydPUrp0aRISErT1hIiIPPFU8l9ERKzmt8LWlStXWLt2LX5+fvj5+TFr1izgl0Bnb28PQEZGBiaTCUBl/UVE5ImnbzkREbGK3IHt5MmTZGRkUKNGDdzc3Bg0aBAZGRkEBQVhZ2dHcHAw9vb2lrCWE9hU1l9ERJ4G+qYTERGryAlsgYGBREdHk5mZiclkwt/fnz59+uDr64vBYGDq1KnY2NgwdepUS1jLoaIjIiLyNFBoExGRApV7hC02NpaoqCgWL17Ms88+y8qVK1m0aBFXrlxh3LhxvPHGGxiNRkaNGkX58uUZMmSIlVsvIiJS8BTaRESkQOUEtqioKNLS0njnnXd4/fXXAWjQoAFubm7MmTOHF154gW7dutGrVy/c3Nzo2rWrNZstIiJiNSpEIiIiBe7atWs0adKE77//nmHDhhEeHp6noIinpycXL15k3759ec5T0REREXkaqT6yiIgUqOzsbEqWLMn69etp2bIln3/+ORcvXsTW1pac54j16tXDycmJ7OzsPOcqsImIyNNIoU1ERArM9OnTmTJlCunp6dSrV4958+bh7OxM+/btOXXqFCkpKaSlpfHFF19QvHhx7b0mIiKC1rSJiEgBMplMTJw4EScnJ0aNGoW7uzsrV66kX79+vPjii1SqVIm6deuSkpLCjh07gF/K+qtKpIiIPM20pk1ERPLFb22cDRAREYGvry8zZszAz88POzs7kpKS8PPz4+uvv2bv3r3UrVsX0Bo2ERERUGgTEZF8dvz4cWrXrp3nWHh4OCNHjmTGjBmMHj2aIkWKkJSURJ8+fbCxsWHfvn04ODj8bvATERF5muibUEREHqn79+9bfo+Li6NOnTqsWLEiz3t8fX2ZOXMmkyZNIjIyknv37lGnTh1iYmIwGo3UqlWL1NRUBTYREREU2kRE5BHavn07c+fO5cCBAwC88sorjBkzhsGDB7Ny5co87+3UqRNFixZlxIgRrFu3DgB3d3eWLl1KhQoVSE5OLvD2i4iIFEZaKCAiIo9EVFQUkyZN4vXXX6dly5aW46GhodjY2PCvf/0LgD59+gBQpEgRfH19adCgQZ6Ns+vXr09cXBx2dnYF2XwREZFCS6FNREQe2qpVq/D19SUqKor27dvj4uKS5/WZM2eSlZVF//79OX36NO7u7nz88ceYzWamTZsG5C06osAmIiLyHypEIiIiD+Xq1av07NmTHj16MHz4cMvx1NRUjh8/TlZWFk2bNgVg1qxZzJs3DycnJ1xdXfnyyy8xmUzWarqIiMhjQSNtIiLy0JKTkylXrpzl7wULFhAXF8e6desoU6YMlStX5quvvmLs2LH06tULk8mEm5sbNjY2KusvIiLyB1SIREREHtqtW7fYvHkzcXFx9OjRgwULFlCqVCm2bdvGhx9+yKVLl3jvvfcAePbZZylbtiw2NjZkZ2crsImIiPwBfVOKiMhDKVWqFP/+97/p3r07cXFxODs7ExYWRv369SlRogQ3b97ExcWF7OxsAAwGg+VclfQXERH5YwptIiLy0Dw8PDh9+jSpqalUqlTpgdednZ0pW7asFVomIiLy+FMhEhERyTdXr17F29uba9eusXfvXoxGo7WbJCIi8tjRSJuIiDxy165dIzIykj179pCcnGwJbFlZWQpuIiIif5EWE4iIyCN34cIF9u7dS9WqVdm3bx8mk4nMzEwFNhERkb9B0yNFRCRfpKSkUKxYMQwGg0bYREREHoJCm4iI5Cuz2ZynYqSIiIj8NZoeKSIi+UqBTURE5OEotImIiIiIiBRiCm0iIiIiIiKFmEKbiIiIiIhIIabQJiIiIiIiUogptImIiIiIiBRiCm0iIiIiIiKFmEKbiIiIiIhIIabQJiIi8jcYDIb/+hMUFGTtJoqIyBPC1toNEBEReRxdvnzZ8vvq1at59913OXnypOWYk5OTNZolIiJPII20iYiI/A1ubm6Wn2LFimEwGHBzc8PZ2Znq1auzdevWPO//7LPPcHR05Pbt25w7dw6DwcCqVato1qwZ9vb21KlTh127duU5JykpiQ4dOuDk5ETp0qXp378/165dK8jLFBGRQkChTURE5BFydHSkd+/eREVF5TkeFRVFjx49cHZ2thzz9/dnzJgxJCQk0LRpUzp16sT169cBSElJ4ZVXXqFhw4YcOnSIrVu38tNPP9GzZ88CvR4REbE+hTYREZFHbNCgQWzbts0yhTI5OZnPP/8cHx+fPO/z9fWle/fu1KpViwULFlCsWDE++ugjAMLDw2nYsCHTp0+nZs2aNGzYkKVLl7Jz505OnTpV4NckIiLWo9AmIiLyiL3wwgu4u7sTHR0NwPLly3nuued4+eWX87yvadOmlt9tbW1p3LgxJ06cACAxMZGdO3fi5ORk+alZsyYAZ86cKaArERGRwkCFSERERPLBoEGDmD9/PuPGjSMqKgpvb28MBsOfPj81NZVOnToxc+bMB14rU6bMo2yqiIgUchppExERyQf9+vXj/PnzzJ07l+PHjzNw4MAH3rN//37L75mZmRw+fJhatWoB0KhRI44dO0bFihWpWrVqnh9HR8cCuw4REbE+hTYREZF88Mwzz9CtWzf8/f1p27Yt5cuXf+A98+fPZ/369Xz33XcMHz6cmzdvWta9DR8+nBs3buDl5cXBgwc5c+YM27Ztw9vbm6ysrIK+HBERsSKFNhERkXzyxhtvkJ6e/kABkhwhISGEhIRQv3599uzZQ2xsLCVLlgSgbNmy7N27l6ysLNq2bUvdunUZPXo0xYsXx8ZGX98iIk8Tg9lsNlu7ESIiIk+iZcuW4efnx6VLl7Czs7McP3fuHJUqVSIhIYEGDRpYr4EiIvJYUCESERGRR+zu3btcvnyZkJAQ3nzzzTyBTURE5K/S/AoREZFHbNasWdSsWRM3NzcCAwOt3RwREXnMaXqkiIiIiIhIIaaRNhERERERkUJMoU1ERERERKQQU2gTEREREREpxBTaRERERERECjGFNhERERERkUJMoU1ERERERKQQU2gTEREREREpxBTaRERERERECrH/B11j3QdOGaX7AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "type_counts.index = type_counts.index.map(type_names)\n",
    "\n",
    "plt.figure(figsize=(10, 6))\n",
    "type_counts.plot(kind='bar', color='skyblue')\n",
    "plt.title('Counts of Each Type')\n",
    "plt.xlabel('Type')\n",
    "plt.ylabel('Count')\n",
    "plt.xticks(rotation=45)\n",
    "plt.grid(axis='y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "509d190f-b874-44c4-9081-6ef76c1e2c68",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = data.drop(columns=['record'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c6809a1e-3faa-4842-a5db-91e62010a45c",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = data.drop('type', axis=1)\n",
    "y = data['type']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "0840753f-b93b-4fae-a832-c0179568b055",
   "metadata": {},
   "outputs": [],
   "source": [
    "type_mapping = {'N': 0, 'SVEB': 1, 'VEB': 2, 'F': 3, 'Q': 4}\n",
    "y = y.map(type_mapping)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "00a8a7b0-d009-4396-8969-aa62019b1e25",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9cfceeac-7b95-4b95-bb47-c2fbdf907979",
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = MinMaxScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3fa7981e-5580-4087-8d90-d7f78b480cb0",
   "metadata": {},
   "outputs": [],
   "source": [
    "smote = SMOTE(sampling_strategy='auto', random_state=42, k_neighbors=3)\n",
    "X_train_resampled, y_train_resampled = smote.fit_resample(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "93016af7-694d-4fbf-864c-1374c3dfbfc6",
   "metadata": {},
   "outputs": [],
   "source": [
    "subset_size = 10000\n",
    "X_train_subsample = X_train_resampled[:subset_size]\n",
    "y_train_subsample = y_train_resampled[:subset_size]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "a2d04f3f-b763-45c1-82ca-cbb4c9c40f71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(n_estimators=50, random_state=101)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;RandomForestClassifier<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.ensemble.RandomForestClassifier.html\">?<span>Documentation for RandomForestClassifier</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>RandomForestClassifier(n_estimators=50, random_state=101)</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(n_estimators=50, random_state=101)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = RandomForestClassifier(random_state=101, n_estimators=50)\n",
    "model.fit(X_train_subsample, y_train_subsample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cb296de7-18aa-4773-8dc1-d2c2811dbad8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.9918909691003244\n",
      "*** Confusion Matrix ***\n",
      "[[30624    19    65     1     0]\n",
      " [   76   299    17     0     0]\n",
      " [   62     1  3937     0     0]\n",
      " [   18     0    25     1     0]\n",
      " [    1     0     0     0     0]]\n",
      "*** Classification Report ***\n",
      "                               precision    recall  f1-score   support\n",
      "\n",
      "                       Normal       0.99      1.00      1.00     30709\n",
      "Supraventricular ectopic beat       0.94      0.76      0.84       392\n",
      "     Ventricular ectopic beat       0.97      0.98      0.98      4000\n",
      "                  Fusion beat       0.50      0.02      0.04        44\n",
      "                 Unknown beat       0.00      0.00      0.00         1\n",
      "\n",
      "                     accuracy                           0.99     35146\n",
      "                    macro avg       0.68      0.55      0.57     35146\n",
      "                 weighted avg       0.99      0.99      0.99     35146\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/enrikasoucy/.pyenv/versions/3.10.6/envs/heart-beat-decoder/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1517: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "/Users/enrikasoucy/.pyenv/versions/3.10.6/envs/heart-beat-decoder/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1517: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n",
      "/Users/enrikasoucy/.pyenv/versions/3.10.6/envs/heart-beat-decoder/lib/python3.10/site-packages/sklearn/metrics/_classification.py:1517: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.\n",
      "  _warn_prf(average, modifier, f\"{metric.capitalize()} is\", len(result))\n"
     ]
    }
   ],
   "source": [
    "y_pred = model.predict(X_test)\n",
    "accuracy = accuracy_score(y_test, y_pred)\n",
    "print(f\"Accuracy: {accuracy}\")\n",
    "print(\"*** Confusion Matrix ***\")\n",
    "print(confusion_matrix(y_test, y_pred))\n",
    "print(\"*** Classification Report ***\")\n",
    "print(classification_report(y_test, y_pred, target_names=list(type_names.values())))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "193ab421-a544-46d0-b49b-abff549f448c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
